Promisify不返回回调数组

时间:2015-01-09 18:02:14

标签: javascript promise bluebird

我是否可以通过任何方式扩充回调,只返回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阵列吗?

如果我只是promisifyAll osascript,我可以在这里削减大量的步骤。但我还是留下了那个傻瓜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种方式编写/使用这些功能,而且我很困惑这是什么?"标准"或者我猜主观的最好的"有些提供更多功能,有些更容易理解和工作,因为你期望。

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

选项1

返回回调并返回整个本机回调。

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

返回回调并打开回调以返回特定值。

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

使用本机回调签名数组返回promise(没有错误)。

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

返回promise,然后返回所需的特定值。

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 个答案:

答案 0 :(得分:0)

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