承诺问题 - .then() 没有被调用?
Promise problems - .then() not getting called?
我有两个需要按特定顺序 运行 的 Sequelize 查询,第一个创建一个模型,第二个从一个数组创建多个模型。它的工作原理是先插入 obj1
然后插入交易数组,但是最后的 'then()' 似乎没有被调用...我做错了什么?
var fn = function addTransaction(transaction) {
return new Promise(function() {
return Transaction.create(transaction, { fields: [ 'Id', 'Name' ]});
}
};
var transactions = [...]; //array of transaction objects
Model1.create(obj1, { fields: [ 'Id', 'Name' ,'Description' ]}).then(function() {
var actions = transactions.map(fn);
var results = Promise.all(actions).then(function(data) {
return Promise.all(data.map(fn));
});
results.then(function() {
console.log("Done?"); //not getting called
});
}).catch(function(err) {
console.log(err);
});
我不确定这是否能准确解决您的问题,但我认为您缺少 return
:
...
return results.then(function() {
console.log("Done?"); //not getting called
});
...
如果没有它,Model1.create
承诺将在 results
完成之前解决。
addTransaction()
永远不会解决它创建的承诺。您创建了一个外部承诺并 return 它,但从未解决它。您至少必须为该回调声明一个 resolve
参数,然后在某处调用 resolve()
。
但是,如果 Transaction.create()
已经 return 是一个承诺,那么您可以将 addTransaction()
更改为:
var fn = function addTransaction(transaction) {
return Transaction.create(transaction, { fields: [ 'Id', 'Name' ]});
};
还不清楚为什么您使用相同的 fn
来处理每个交易产生的 transactions
数组和 data
数组。从逻辑的角度来看,这似乎有点奇怪。您确定这是编写代码的正确方法吗?为了让我们帮助您设计那部分代码,您必须通过对第一个交易数组然后再次对结果调用 fn
来更多地解释您想要完成的工作从那个。
我有两个需要按特定顺序 运行 的 Sequelize 查询,第一个创建一个模型,第二个从一个数组创建多个模型。它的工作原理是先插入 obj1
然后插入交易数组,但是最后的 'then()' 似乎没有被调用...我做错了什么?
var fn = function addTransaction(transaction) {
return new Promise(function() {
return Transaction.create(transaction, { fields: [ 'Id', 'Name' ]});
}
};
var transactions = [...]; //array of transaction objects
Model1.create(obj1, { fields: [ 'Id', 'Name' ,'Description' ]}).then(function() {
var actions = transactions.map(fn);
var results = Promise.all(actions).then(function(data) {
return Promise.all(data.map(fn));
});
results.then(function() {
console.log("Done?"); //not getting called
});
}).catch(function(err) {
console.log(err);
});
我不确定这是否能准确解决您的问题,但我认为您缺少 return
:
...
return results.then(function() {
console.log("Done?"); //not getting called
});
...
如果没有它,Model1.create
承诺将在 results
完成之前解决。
addTransaction()
永远不会解决它创建的承诺。您创建了一个外部承诺并 return 它,但从未解决它。您至少必须为该回调声明一个 resolve
参数,然后在某处调用 resolve()
。
但是,如果 Transaction.create()
已经 return 是一个承诺,那么您可以将 addTransaction()
更改为:
var fn = function addTransaction(transaction) {
return Transaction.create(transaction, { fields: [ 'Id', 'Name' ]});
};
还不清楚为什么您使用相同的 fn
来处理每个交易产生的 transactions
数组和 data
数组。从逻辑的角度来看,这似乎有点奇怪。您确定这是编写代码的正确方法吗?为了让我们帮助您设计那部分代码,您必须通过对第一个交易数组然后再次对结果调用 fn
来更多地解释您想要完成的工作从那个。