Node.js async to sync

后端 未结 5 1010
走了就别回头了
走了就别回头了 2020-12-13 19:44

How can I make this work

var asyncToSync = syncFunc();

function syncFunc() {
    var sync = true;
    var data = null;
    query(params, function(result){
          


        
相关标签:
5条回答
  • 2020-12-13 19:45

    The issue you are having is that your tight while loop is blocking. So I don't think your query callback will ever be run. I think you need to use setTimeout or the like to prevent the function from blocking, but should you do so, the function will return before the callback is called. This functionality must be implemented at a lower level.

    If you are in the browser, you might check out this article. In node you have to rely on the implementation of whatever you're querying. It may or may not provide synchronous methods.

    0 讨论(0)
  • 2020-12-13 20:02

    You can do it with node-sync lib

    var sync = require('sync');
    
    sync(function(){
      var result = query.sync(query, params);
      // result can be used immediately
    })
    

    Notice: your query must use standart callback call (with error first): callback(error, result). If you can't change query method, just create .async() wrapper (see github link).

    0 讨论(0)
  • 2020-12-13 20:03

    Use deasync - a module written in C++ which exposes Node.js event loop to JavaScript. The module also exposes a sleep function that blocks subsequent code but doesn't block entire thread, nor incur busy wait. You can put the sleep function in your while loop:

    var asyncToSync = syncFunc();
    
    function syncFunc() {
        var sync = true;
        var data = null;
        query(params, function(result){
            data = result;
            sync = false;
        });
        while(sync) {require('deasync').sleep(100);}
        return data;
    }
    
    0 讨论(0)
  • 2020-12-13 20:04

    I've been using syncrhonize.js with great success. There's even a pending pull request (which works quite well) to support async functions which have multiple parameters. Far better and easier to use than node-sync imho. Added bonus that it has easy-to-understand and thorough documentation, whereas node-sync does not.

    0 讨论(0)
  • 2020-12-13 20:09

    Nowadays this generator pattern can be a fantastic solution in many situations:

    // nodejs script doing sequential prompts using async readline.question function
    
    var main = (function* () {
    
      // just import and initialize 'readline' in nodejs
      var r = require('readline')
      var rl = r.createInterface({input: process.stdin, output: process.stdout })
    
      // magic here, the callback is the iterator.next
      var answerA = yield rl.question('do you want this? ', res=>main.next(res))    
    
      // and again, in a sync fashion
      var answerB = yield rl.question('are you sure? ', res=>main.next(res))        
    
      // readline boilerplate
      rl.close()
    
      console.log(answerA, answerB)
    
    })()    // <-- executed: iterator created from generator
    main.next()     // kick off the iterator, 
                    // runs until the first 'yield', including rightmost code
                    // and waits until another main.next() happens
    
    0 讨论(0)
提交回复
热议问题