承诺与async.each无法按预期工作

时间:2017-01-14 12:30:03

标签: node.js promise async.js

我以某种方式无法找到解决方案。这就是我正在做的事情:

    async.each(bottles, function(bottle) {
        // set substance quantity to 0
        updateQuantity(bottle[constant.SUBSTANCE_ID], 0)
            .then(function() {
                bottle[constant.EXPIRY] = expiry;
                bottle[constant.IS_AVAILABLE] = true;

                updateRecord(bottle)
                    .then(function() {
                        console.log('Updated');
                    },
                    function() {});
            }, function() {});
    }, function() {
        console.log('Finished');
    });
    console.log('Done');

方法updateQuantity和updateRecord返回promises,并在后台使用Knex update,它也返回一个promise。 我希望上面代码的输出为:

Updated
Updated
Finished
Done

但我得到的输出是:

Done
Updated
Updated

因此, async.each 的回调无效,代码不会等待 async.each 完成。

2 个答案:

答案 0 :(得分:0)

不要对promises使用async.js,它们能够满足你内置方法所需的功能,而且你不需要回退回调。

import org.apache.spark.sql.functions.lit

val df1_date = df1.withColumn("date", to_date(df1("start_date_time")))
val df2_date = (df2.withColumn("date", to_date(df2("start_date"))).
                    withColumn("check", lit(1)).
                    select($"PK".as("ID"), $"date", $"check"))

df1_date.join(df2_date, Seq("ID", "date"), "left").drop($"date").na.fill(0).show

+---+--------------------+-----+
| ID|     start_date_time|check|
+---+--------------------+-----+
|  1|2016-10-12 11:55:...|    1|
|  2|2016-10-12 12:25:...|    0|
|  3|2016-10-12 16:20:...|    0|
+---+--------------------+-----+

答案 1 :(得分:-1)

您必须从callback操作调用传入的async.each。实际上,async并不知道你的回调何时解决。

另外,DONE应该始终是您看到async.each没有阻止的第一个文字。当您开始运行脚本时,async.each将被注册,但由于您的代码是异步的,因此它会在console.log('Done')updateRecord完成之前到达updateQuantities

async.each(bottles, function(bottle, callback) {
    updateQuantity(bottle[constant.SUBSTANCE_ID], 0)
        .then(function() {
            ...

            updateRecord(bottle)
                .then(function() {
                    console.log('Updated');
                    callback();
                },
                function() {});
        }, function() {});
}, function() {
    console.log('Finished');
});
console.log('Done');