Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript承诺(Q)在进入下一个之前不需要等待解决_Javascript_Promise - Fatal编程技术网

Javascript承诺(Q)在进入下一个之前不需要等待解决

Javascript承诺(Q)在进入下一个之前不需要等待解决,javascript,promise,Javascript,Promise,我有一段代码,它试图加载一个电子表格,然后它需要做一些事情,然后再次加载它: var Q = require('q'), editGoogleSpreadsheet = require('edit-google-spreadsheet'); loadSpecificSheet = function(_spreadsheetName, _worksheetName) { return Q.ninvoke(editGoogleSpreadsheet, 'load', {

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

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");
但是,它同时加载电子表格两次,如调试中所示:

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

为什么链中的第二个承诺不等待链中的第一个承诺?我需要它等待…

您需要将第二个
加载
调用包装到函数中,并从
正确返回值。然后()
回调:

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);
  });

(请注意,我无法真正测试。)

您正在将调用
google.loadSpecficSheet()
的结果传递到第二个
调用中。然后()
调用。我想我可能在不应该调用的时候调用了。。。我如何不调用google.loadSpecficSheet(),但仍然为它提供所需的参数呢?它确实有效。我以为既然loadSpecificSheet返回了Q.ninvoke(),它就得到了一个承诺,但我猜Q.ninvoke()并没有返回一个承诺…@mattnificent好的!我应该在简历中添加“谷歌电子表格API:)