首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何克服异步非阻塞不能及时返回值?

问如何克服异步非阻塞不能及时返回值?
EN

Stack Overflow用户
提问于 2014-09-18 01:40:30
回答 3查看 830关注 0票数 0

我正在创建一个JSON对象数组,然后将其存储在mongodb中。每个JSON对象都包含许多字段-每个字段都是在我将对象保存到mongodb之前填充的。

一些对象属性是通过对其他网站(如last.fm )进行API调用来填充的,但是在对象保存到mongodb之前,返回的值不足以填充属性。

如何在保存对象之前等待对象的所有属性都被填充?我确实尝试过async.waterfall,但它仍然没有等待就失败了,我最终得到了一个数据库,其中充满了带有空字段的文档。

任何帮助都将不胜感激。谢谢:)

EN

回答 3

Stack Overflow用户

发布于 2014-09-18 04:06:13

在JavaScript中有几个控制异步的选项:

async.all([...], function (err) {

  • Promises:(

  1. )http://npmjs.org/async (http://npmjs.org/q) http://npmjs.org/concat-stream (http://npmjs.org/concat-stream)参见https://github.com/substack/stream-handbook
票数 1
EN

Stack Overflow用户

发布于 2014-09-18 06:46:15

由于您说您正在对其他网站进行多个API调用,因此您可能想要尝试:

代码语言:javascript
复制
async.each(api_requests,
    function(api_request, cb) {
        request(api_request, function (error, response, body) {
            /* code */
            /* add to model for Mongo */
            cb();
        });
    },
    function(err) {
        // continue execution after all cbs are received
        /* code */
        /* save to Mongo, etc.. */
    }
);

以上示例最适用于发出多个相同格式的请求的情况。如果下一步的输入依赖于上一步的输出,请查看瀑布(https://github.com/caolan/async#waterfall)文档;如果有一堆互不相关的任务,请查看并行(https://github.com/caolan/async#parallel)。异步的伟大之处在于,你可以将所有函数嵌套在一起,并将它们串在一起,以支持你想要做的事情。

票数 1
EN

Stack Overflow用户

发布于 2014-09-18 03:51:41

您可能希望使用promises或某种回调机制。下面是一个使用jPromise的promise方法的示例

代码语言:javascript
复制
var jPromise = require('jPromise');
var promises = [];

for(var i = 0; i < 10; i++) {
    promises.push(someAsyncApiCall(i));
}

jPromise.when(promises).then(function() {
    saveThingsToTheDb();
});

同样,如果没有promise库:

代码语言:javascript
复制
var finished = 0;
var toDo = 10;

function allDone() {
    saveThingsToTheDb();
}

for(var i = 0; i < toDo.length; i++) {
    someAsyncApiCall(function() {
        finished++;

        if(finished === toDo) {
            allDone();
        }
    });
}

就我个人而言,我更喜欢promise方法,但只有当您调用的API返回某种promise时,它才会更好。如果没有,你将会被解决,并以某种方式用promises (Q does this pretty well)包装回调API。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25897011

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档