У меня есть два запроса 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);
});
0
meanrims 21 Фев 2016 в 03:02

2 ответа

Лучший ответ

addTransaction() никогда не выполнит обещание, которое оно создает. Вы создаете внешнее обещание и возвращаете его, но никогда не выполняете его. По крайней мере, вам нужно будет объявить аргумент resolve для этого обратного вызова, а затем где-нибудь вызвать resolve().

Но если Transaction.create() уже возвращает обещание, вы можете изменить addTransaction() на это:

var fn = function addTransaction(transaction) {
     return Transaction.create(transaction, { fields: [ 'Id', 'Name' ]});
};

Также неясно, почему вы используете один и тот же fn для обработки как массива transactions, так и массива data, полученного в результате каждой из этих транзакций. Это кажется немного странным с логической точки зрения. Вы уверены, что это правильный способ написания кода? Чтобы мы помогли вам с разработкой этой части кода, вам нужно будет больше объяснить, чего вы пытаетесь достичь, вызывая fn как для первого массива транзакций, так и снова для результатов. От этого.

2
jfriend00 21 Фев 2016 в 00:36

Я не уверен, что это решит вашу проблему точно, но я думаю, что вам не хватает return:

...
return results.then(function() {
    console.log("Done?"); //not getting called
});
...

Без него обещание Model1.create разрешилось бы до завершения results.

0
Sanketh Katta 21 Фев 2016 в 00:19