2015-08-06 9 views
0

у меня есть этот код, который пытается загрузить таблицу, а затем он должен сделать что-то, а затем загрузить его снова:Javascript Promises (Q) не ждать, чтобы решить, прежде чем переходить к следующему один

var Q = require('q'), 
    editGoogleSpreadsheet = require('edit-google-spreadsheet'); 


loadSpecificSheet = function(_spreadsheetName, _worksheetName) { 
    return Q.ninvoke(editGoogleSpreadsheet, 'load', { 
     debug: true, 
     spreadsheetName: _spreadsheetName, 
     worksheetName: _worksheetName, 
     oauth: { 
      email: superSecretEmail, 
      keyFile: superSecretKeyfile 
     } 
    }); 
}; 


google.loadSpecificSheet(spreadsheetName, worksheetName).then(
    function(spreadsheet) { 
     console.log("loaded") 
    }, 
    function(err) { node.warn("sheet failed to load: " + err); } 
).then(
    google.loadSpecificSheet(spreadsheetName, worksheetName).then(
     function(spreadsheet) { 
      console.log("loaded 2") 
     }, 
     function(err) { node.warn("sheet failed to load 2: " + err); } 
    ) 
).catch(function(err) { node.warn("ToGoogleSheetNode Error: " + err); }); 

console.log("promises added to queue"); 

Но, загружает таблицу 2 раза одновременно, как показано в отладке:

promise added to queue 
Logging into Google... 
Logging into Google... 
Logged into Google 
Searching for Spreadsheet 'Book1'... 
Logged into Google 
Searching for Spreadsheet 'Book1'... 
Searching for Worksheet 'Sheet1'... 
Searching for Worksheet 'Sheet1'... 
loaded 2 
loaded 

Почему второе обещание в цепи, не дожидаясь первого обещания в цепи? Мне это нужно ждать ...

+0

Вы передаете результат * вызова * 'google.loadSpecficSheet()' во второй вызов '.then()'. – Pointy

+0

Я думал, что я мог бы вызывать, когда мне не следовало ... как мне не вызывать google.loadSpecficSheet(), но все-таки дать ему необходимые параметры? – mattnificent

ответ

1

Вам нужно завернуть, что второй load вызов функции и правильно возвращать значения из ваших .then() обратных вызовов:

google.loadSpecificSheet(spreadsheetName, worksheetName) 
    .then(
    function(spreadsheet) { 
     console.log("loaded"); 
     return spreadsheet; 
    }, 
    function(err) { node.warn("sheet failed to load: " + err); } 
) 
    .then(function() { 
    return google.loadSpecificSheet(spreadsheetName, worksheetName) 
    }) 
    .then(
    function(spreadsheet) { 
     console.log("loaded 2"); 
    }, 
    function(err) { node.warn("sheet failed to load 2: " + err); } 
) 
    .catch(function(err) { 
     node.warn("ToGoogleSheetNode Error: " + err); 
    }); 

(Обратите внимание, что я не могу проверить это .)

+0

Это действительно сработало. Я думал, что, поскольку loadSpecificSheet возвращал Q.ninvoke(), он получал обещание там, но я думаю, Q.ninvoke() не возвращает обещание ... – mattnificent

+1

@mattnificent ok great! Я должен добавить «API Google Spreadsheet» в мое резюме :) – Pointy

Смежные вопросы

 Смежные вопросы