承诺不 return 回调数组

Promisify to not return callback array

有什么方法可以将回调扩充到仅 return result 而不是包含 raw 的数组?

var Promise = require("bluebird");
var osascript = require('node-osascript');

function osxBackgroundGet(callback) {
  return osascript.execute([
    'tell application "System Events"',
    'tell current desktop',
    'get picture',
    'end tell',
    'end tell'
  ].join("\n"), callback);
}

/*
osxBackgroundGet(function(err, result, raw){
  console.log(result);
})
*/

var osxBackgroundGet = Promise.promisify(osxBackgroundGet);

osxBackgroundGet().then(function(signature){
  var result = signature[0];
})

或者我应该在 osxBackgroundGet callback 内处理这个问题?

像这样:

function osxBackgroundGet(callback) {
  return osascript.execute([
    'tell application "System Events"',
    'tell current desktop',
    'get picture',
    'end tell',
    'end tell'
  ].join("\n"), function(err, result, raw){
    if(err) return callback(err)
    return callback(err, result)
  });
}

我真的不喜欢编辑图书馆的原生 callback。我应该只保留 signature 数组吗?

如果我只是 osascriptpromisifyAll,我可以在这里减少很多步骤。但我仍然留下了那个该死的 signature array.

var Promise = require("bluebird")
var osascript = Promise.promisifyAll(require('node-osascript'))

osascript.executeAsync([
  'tell application "System Events"',
  'tell current desktop',
  'get picture',
  'end tell',
  'end tell'
].join("\n")).then(function(signature){
  console.log(signature);
});

更新:

我可以通过 4 种方式编写/使用这些函数,但我对哪种方式感到困惑 "standard" 或者我猜想是主观的 "best" 有些提供了更多的通用性,有些则更容易理解并按照您的预期工作。

var Promise = require("bluebird")
var osascript = require('node-osascript');
var osascriptPromise = Promise.promisifyAll(osascript)

选项 1

Returns 回调,只是 return 整个原生回调。

function osxBackgroundGetCallback(callback){
  return osascript.execute([
    'tell application "System Events"',
    'tell current desktop',
    'get picture',
    'end tell',
    'end tell'
  ].join("\n"), callback);
}

// usage
/*
var getBg = Promise.promisify(osxBackgroundGetCallback);
getBg().then(function(sig){
  var bg = sig[0]
});
*/

选项 2

Returns 回调并打开回调至 return 特定值。

function osxBackgroundGetCallbackValue(callback){
  return osascript.execute([
    'tell application "System Events"',
    'tell current desktop',
    'get picture',
    'end tell',
    'end tell'
  ].join("\n"), function(err, result, raw){
    if(err) return callback(err);
    return callback(result);
  });
}

// usage
/*
var getBg = Promise.promisify(osxBackgroundGetCallbackValue);
getBg().then(function(bg){

});
*/

选项 3

Returns 使用本机回调签名数组承诺(没有错误)。

function osxBackgroundGetPromise(){
  return osascriptPromise.executeAsync([
    'tell application "System Events"',
    'tell current desktop',
    'get picture',
    'end tell',
    'end tell'
  ].join("\n"))
}

// usage
/*
getBg().then(function(sig){
  var bg = sig[0];
});
*/

选项 4

Returns 承诺 return 所需的特定值。

function osxBackgroundGetPromiseValue(){
  return osascriptPromise.executeAsync([
    'tell application "System Events"',
    'tell current desktop',
    'get picture',
    'end tell',
    'end tell'
  ].join("\n")).then(function(sig){
    var result = sig[0]
    var raw = sig[1]
    return result
  })
}

// usage
/*
getBg().then(function(bg){

});
*/

最佳选项是选项 1 / 3,但不是使用 then,而是使用 spread。这样您就可以访问所有变量,而无需深入研究雄心勃勃的数组。