Javascript Promises (Q)不会等待下一个问题被解决

Javascript Promises (Q) does not wait to be resolved before going to the next one

本文关键字:下一个 等待 问题 解决 Promises Javascript      更新时间:2023-09-26

我有这个代码,它试图加载一个电子表格,然后它需要做一些事情,然后再次加载:

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次,如debug中所示:

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

为什么链中的第二个承诺不等待链中的第一个承诺?

您需要在函数中包装第二个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);
  });

(注意,我不能真正测试这个)