在node.js中使用wait.for发出问题

时间:2014-01-07 15:02:37

标签: javascript node.js asynchronous wait

对于节点中的npm模块,尝试让这些函数同步执行:saveFlightDetails需要先完成saveFlight,然后需要saveItem首先完成...这三个函数的每一组都需要在循环迭代之前完成到下一组数据。

我有一个for循环,其中包含以下代码,我的数据集迭代两次(2次飞行)。

function saveData(app, data, i){

            var Item = app.get('models').Item;
            var Flight = app.get('models').Flight;
            var FDeparture = app.get('models').FDeparture;
            var FArrival = app.get('models').FArrival;
            var currentItem = [],
                currentFlight = [];

            wait.for(saveItem, data, Item, i, currentItem, currentFlight);
            console.log('currentItem: ' + currentItem);
            wait.for(saveFlight, data, Flight, i, currentItem, currentFlight);
            console.log('currentFlight: ' + currentFlight);
            wait.for(saveFlightDetails, data, FDeparture, FArrival, i, currentItem, currentFlight);


    }

    wait.launchFiber(saveData, app, data, i);

和saveItem,saveFlight和saveFlightDetails转到将数据保存到db的其他函数。这是saveItem,但其他看起来非常相似:

function saveItem(data, Item, i, currentItem, currentFlight){   
 console.log('Entered item function.');
 Item.create({ 
     ...
    }).success(function(item){
     console.log('Created item.');
     currentItem = item;

    });
}

由于某些我似乎无法解释的原因,循环按预期迭代两次,但输出为:

Reached saveItem function.
Reached saveItem function.
Item saved.
Item saved.

saveFlight和saveFlightDetails函数不会与currentItem和currentFlight的console.logs一起被调用,但是saveItem正确运行...

我认为这会调用saveItem并等到它完成,然后调用saveFlight并等待,然后调用saveFlightDetails并等待。然后迭代。我做错了什么?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

好的,我找到了答案。对于那些可能觉得有用的人来说,因为在wait.for上没有很多示例文档,我需要创建更多的光纤。因此,不是让一个光纤用于一个函数saveData,而是3个wait.for中的调用,我需要3个光纤,每个光纤都有自己的功能,每个光纤都有一个wait.for调用。 Psuedocode如下:

function save1(args){
    wait.for(asyncfunction1, args);
    console.log('save1 done.');
}

function save2(args){
    wait.for(asyncfunction2, args);
    console.log('save2 done.');
}

function save3(args){
    wait.for(asyncfunction3, args);
    console.log('save3 done.');
}


wait.launchFiber(save1, app, data, i);
wait.launchFiber(save2, app, data, i);
wait.launchFiber(save3, app, data, i);