2

我有这个异步函数,我想把它变成一个承诺

    var myAsyncFunction = function(err, result) {
        if (err) 
            console.log("We got an error");


        console.log("Success");
    };

    myAsyncFunction().then(function () { console.log("promise is working"); });

我得到 TypeError: Cannot call method 'then' of undefined。

这段代码有什么问题?

4

2 回答 2

4

Q有多种方式:

Q.nfcall(myAsyncFunction, arg1, arg2);
Q.nfapply(myAsyncFunction, [arg1, arg2]);

// Work with rusable wrapper
var myAsyncPromiseFunction = Q.denodeify(myAsyncFunction);
myAsyncPromiseFunction(arg1, arg2);

延迟实施中:

var myAsyncPromiseFunction = deferred.promisify(myAsyncFunction);
myAsyncPromiseFunction(arg1, arg2);

一个显着的区别:由 Deferred 生成的包装器另外自动解析作为参数传递的承诺,所以你可以这样做:

var readFile = deferred.promisify(fs.readFile);
var writeFile = deferred.promisify(fs.writeFile);

// Copy file
writeFile('filename.copy.txt', readFile('filename.txt'));
于 2013-10-22T08:17:04.207 回答
-2

myAsyncFunction 在您的代码中不返回任何内容(实际上未定义)。

如果你使用whenjs,正常的方式是这样的:

var myAsyncFunction = function() {

    var d = when.defer();

    //!!!do something to get the err and result

    if (err) 
       d.reject(err);
    else
       d.resolve.(result);

    //return a promise, so you can call .then
    return d.promise;
};

现在您可以致电:

myAsyncFunction().then(function(result(){}, function(err){});
于 2013-10-22T08:28:16.947 回答