2

我正在尝试使用使用 Bluebirds Collection 功能的承诺链。

例如其中一个脚本:

var rest = require("./promisified_restler.js");
function memory(token) {
    CHECK='cfDJO9im';
    URL='https://monitoring.api.foo.com/v1.0/833/';
    SLUG='entities/en5mKIvs/checks/';
    MODE='/test';

    url = CHECK+URL+SLUG+CHECK+MODE
    headers = { headers:
        { "X-Auth-Token": token }
    }
    return rest.post(url, headers);
}


module.exports = memory;

主脚本:

var getToken = require('./get_token.js');
var memory = require('./memory.js');
var cpu = require('./cpu.js');
var http = require('./http.js');
var httpPort = require('./http_port.js');
var network = require('./network.js');

getToken()
.catch(function(e) {
    console.log(e);
})
.all([cpu(token), memory(token)]).spread(function(cpu_result,
            memory_result) {
                console.log(JSON.stringify(cpu_result));
                console.log(JSON.stringify(memory_result));
            }); 
  1. 如何将令牌值传递给每个返回承诺对象的函数?

  2. 如果一个 Promise 对象返回被拒绝,Promise.all() 会发生什么?.all() 是否停止、返回 false 并且未完成数组中的其余项目?

  3. 功能/承诺对象是否并行运行?
  4. 是否可以让 spread() 只接受一个参数并将其应用于返回的每个值?例子: .spread(function(returnedValue) {console.log(JSON.stringify(returnedValue)); });
4

1 回答 1

2

你打电话.all()错了,它不带任何参数(静态版本)。如果您打算这样做,无论如何都不需要它.spread

Promise 不会运行任何东西,它们只是告诉你什么时候运行。您是调用某个函数来启动 I/O 的人 - 如果您随后在下一行同步调用另一个函数,则两者同时运行。如果您在第一个函数完成后调用另一个函数,它们将按顺序运行。仅当Promise.all两者都完成时,您才能看到这一点,与它们没有任何其他关系。

我不明白 1. 和 4.. 这是代码:

getToken()
    .then(function(token) {
        return [cpu(token), memory(token)];
    })
    .spread(function(cpu_result, memory_result) {
        console.log(JSON.stringify(cpu_result));
        console.log(JSON.stringify(memory_result));
    })
    /*
    This is totally unnecessary because unhandled errors are logged anyway.
    Uncomment if you want to actually handle the error
    .catch(function(e) {
       console.log(e);
    });
    */
于 2014-05-28T09:00:23.173 回答