我以某种方式无法找到解决方案。这就是我正在做的事情:
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 完成。
答案 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');