2015-09-30 50 views
0

我有一個使用async/await模塊編寫的nodejs庫。我試圖從使用常規回調的庫中使用它。下面是一個示例代碼:從回調調用asyncwait

var async = require('asyncawait/async'); 
var await = require('asyncawait/await'); 
var Promise = require('bluebird'); 

var foo = async (function() { 
    var resultA = await (Promise.promisify(bar)); 
    return 111; 
}) 

function bar(callback) { 
    setTimeout(callback, 2000) 
} 

function moo() { 
    var f = async.cps(foo) 

    f(function(err, res) { 
    console.log(res) 
    }) 

} 

moo() 

我預想的console.log打印111,而是它打印:

{ _bitField: 0, 
    _fulfillmentHandler0: undefined, 
    _rejectionHandler0: undefined, 
    _progressHandler0: undefined, 
    _promise0: undefined, 
    _receiver0: undefined, 
    _settledValue: undefined } 

順便說一句,如果我內聯中的「async.cps」行它的工作原理foo的實施(但這不是一個選項,因爲它是一個外部庫)。

有什麼想法?

回答

1

我已經看過你使用的圖書館,並看它(沒有太多,當然沒有工作樣品),你沒有正確使用它。

async(fn)將返回一個接受某些輸入值的函數,並在執行時返回一個承諾(可能爲standard Promises/A+)。在裏面,它將使用輸入參數調用fn,並在fn返回時解決返回的承諾。

async.cps(...)將返回接受某些輸入值節點樣式回調函數(function (err, res))和在執行時將返回一個空隙(undefined)的功能。在裏面,它將用輸入參數調用fn,並在fn返回適當的值時調用回調函數。

你的代碼是用async(fn)創建一個函數,然後將這個函數傳遞給async.cps(..),就好像你叫async.cps(async(fn))一樣,但這沒有任何意義。

,如果你想要一個承諾「轉換」爲節點式的回調函數使用這個庫(!unpromisifying),你可以做的是這樣的:

function moo() { 
    var f = async.cps(function() { 
    return await (foo()) 
    }) 

    f(function(err, res) { 
    console.log(res) 
    }) 
} 
1

您雙擊asynced的foo功能。這裏是你的選擇,取決於你是否可以修改的foo或不聲明:

離開foo異步,並創建一個接受使用cps節點式的回調函數f

var async = require('asyncawait/async'); 
var await = require('asyncawait/await'); 
var Promise = require('bluebird'); 

var foo = async(function() { 
    var resultA = await (Promise.promisify(bar)); 
    return 111; 
}); 

function bar(callback) { 
    setTimeout(callback, 1000); 
} 

function moo() { 
    var f = async.cps(function() { 
    return await(foo()); 
    }); 
    f(function(err, res) { 
    console.log(res); 
    }); 
} 

moo(); 

離開foo異步,並使用異步moo

var async = require('asyncawait/async'); 
var await = require('asyncawait/await'); 
var Promise = require('bluebird'); 

var foo = async(function() { 
    var resultA = await (Promise.promisify(bar)); 
    return 111; 
}); 

function bar(callback) { 
    setTimeout(callback, 1000); 
} 

var moo = async(function() { 
    try { 
    var res = await(foo()); 
    console.log(res); 
    } catch (err) { 
    } 
});  

moo(); 

foo已經cps在宣言:

var async = require('asyncawait/async'); 
var await = require('asyncawait/await'); 
var Promise = require('bluebird'); 

var foo = async.cps(function() { 
    var resultA = await (Promise.promisify(bar)); 
    return 111; 
}); 

function bar(callback) { 
    setTimeout(callback, 1000); 
} 

function moo() { 
    foo(function(err, res) { 
    console.log(res); 
    }); 
} 

moo();