nodejs中的fiber(纤程)库详解(3)

这个方法前面已经多次看到了。顾名思义,它的作用就是等待结果。如果要等待一个future的实例的结果,直接调用 futureInstance.wait()即可;如果需要等待一系列future实例的结果,则调用 Future.wait(futuresArray)。需要注意的是,在第二种用法中,一个future实例在运行时出现错误, wait方法不会抛出错误,不过我们可以使用 get()方法直接获取运行结果。

5.Future.prototype.get():

get()的用法与 wait()的第一种方式很像,所不同的是, get()立刻返回结果。如果数据没有准备好, get()会抛出错误。

6.Future.prototype.resolve(param1,param2):

上面的的 wrap方法总给人以一种 future其实在吞噬异步方法的回调函数,并直接返回异步结果。事实上 future也通过 resolve方法提供设置回调函数的解决方案。 resolve最多接受两个参数,如果只传入一个参数, future认为传了一个node风格的回调函数,例如如下示例:

复制代码 代码如下:


futureInstance.resolve(function (err, data) {
    if (err) {
        throw  err;
    } else {
        console.log(data.toString());
    }
});

如果传入两个参数,则表示对错误和数据分别做处理,示例如下:

复制代码 代码如下:


futureInstance.resolve(function (err) {
    throw err;
}, function (data) {
    console.log(data.toString());
});

另外 future并不区分 resolve的调用时机,如果数据没有准备好,则将回调函数压入队列,由 resolver()方法统一调度,否则直接取数据立即执行回调函数。

7.Future.prototype.isResolved():

返回布尔值,表示操作是否已经执行。

8.Future.prototype.proxy(futureInstance):

proxy方法提供一种 future实例的代理,本质上是对 resolve方法的包装,其实是将一个instance的回调方法作为另一个instance的回调执行者。例如:

复制代码 代码如下:


var target = new Future;
target.resolve(function (err, data) {
    console.log(data)
});
var proxyFun = function (num, cb) {
    cb(null, num * num);
};
Fiber(function () {
    var proxy = Future.wrap(proxyFun)(10);
    proxy.proxy(target);
}).run(); // 输出100

虽然执行的是 proxy,但是最终 target的回调函数执行了,并且是以 proxy的执行结果驱动 target的回调函数。这种代理手段也许在我们的实际应用中有很大作用,我暂时还没有深入地思考过。

9.Future.prototype.return(value):

10.Future.prototype.throw(error):

11.Future.prototype.resolver():

12.Future.prototype.detach():

以上四个API呢我感觉相对于别的API,实际使用的场景或作用比较一般。 return和 throw都受 resolver方法调度,这三个方法都很重要,在正常的future使用流程中都会默默工作着,只是我没有想出具体单独使用它们的场景,所以没有办法具体介绍。 detach方法只能算 resolve方法的简化版,亦没有介绍的必要。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgjppy.html