Node.js async to sync

匿名 (未验证) 提交于 2019-12-03 02:05:01

问题:

How can I make this work

var asyncToSync = syncFunc();  function syncFunc() {     var sync = true;     var data = null;     query(params, function(result){         data = result;         sync = false;     });     while(sync) {}     return data; } 

I tried to get sync function from async one, I need it to use FreeTds async query as sync one

回答1:

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; } 


回答2:

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).



回答3:

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)  })()    // 


回答4:

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.



回答5:

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.



文章来源: Node.js async to sync
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!