2015-05-08 33 views
3

我無法對藍鳥做一個簡單的例子。我已經使用新的承諾方法,它的工作原理,但是當我嘗試使用Promisify方法時,我可能會做錯了什麼。我正在嘗試使用藍鳥的方法Promisify,它不起作用

exports.makeRequest = function(someText){ 
    return Promise.resolve(someText); 
} 

var makeRequestAsync = Promise.promisify(exports.makeRequest); 

makeRequestAsync('Testing').then(function(data){ 
    console.log(data); // --> log never appears 
}); 

我真的很想了解Promisify的工作原理。

+1

你不需要promisify它。只需調用'makeRequest',它已經返回一個已解決的承諾。 – thefourtheye

回答

6

Bluebird的promisify()僅適用於將回調作爲其最後一個參數的節點樣式函數,其中該回調函數接受兩個參數,即錯誤和數據。你的功能不符合這個標準。

你可以閱讀它的工作原理here

此外,沒有必要promisify函數已經返回一個承諾。您可以直接調用該函數並使用其返回的承諾,因爲它已經是一個承諾返回函數。

exports.makeRequest = function(someText){ 
    return Promise.resolve(someText); 
} 

exports.makeRequest('Testing').then(function(data){ 
    console.log(data); 
}); 

工作演示:http://jsfiddle.net/jfriend00/n01zyqc6/


當然,因爲你的函數實際上不是異步,似乎沒有任何理由使用,甚至承諾與它在所有。


這裏的實際promisifying東西是異步,並使用正確的調用約定的例子:

exports.myFunc = function(data, callback) { 
    // make the result async 
    setTimeout(function() { 
     // call the callback with the node style calling convention 
     callback(0, data); 
    }, 500); 

}; 

var myFuncAsync = Promise.promisify(exports.myFunc); 

myFuncAsync("Hello").then(function(result) { 
    console.log(result); 
}); 
+0

謝謝!但是,在這個例子中,我怎麼能使這個函數與promisify一起工作呢? –

+0

@ElvioCavalcante - 首先,使用你自己的函數promisify沒有意義,它不像你那樣是異步的。你已經寫了它與承諾一起工作,所以沒有必要進一步promisify它。其次,如果你閱讀我發佈的鏈接,你只需要讓你的函數遵循上面描述的'nodeFunction'約定,然後你可以調用promisify。 promisify僅適用於遵循特定調用約定的函數,然後在完成其工作時必須使用正確的參數調用回調函數。 – jfriend00

+0

@ElvioCavalcante - 如果您描述了您正在嘗試解決的實際問題,而不是試圖提出一個已經具有諾言兼容性的功能,那麼我們可能會更好,因此不需要對其進行提示。 – jfriend00

相關問題