xiaobaifeng / README

各种 README
0 stars 1 forks source link

异步等待提案 #34

Open xiaobaifeng opened 3 years ago

xiaobaifeng commented 3 years ago

proposal-async-await

异步等待提案

了解队列

专业名词注释

q/design

q: `Queue` 队列 

来源: https://github.com/kriskowal/q/tree/master/design

相关知识

promise

考虑一种更通用的方法,在该方法中,函数返回一个代表函数最终结果的对象,而不是返回值或引发异常,该对象是成功的还是失败的。这个对象无论是形象上还是名字上都是最终解决的承诺。我们可以在promise上调用函数以观察其实现或拒绝。如果承诺被拒绝并且未明确遵守拒绝,则出于相同的原因,任何派生的承诺都会被隐式拒绝。

在设计的特定迭代中,我们将使用注册回调的“ then”函数将promise建模为对象。

var maybeOneOneSecondLater = function () {
    var callback;
    setTimeout(function () {
        callback(1);
    }, 1000);
    return {
        then: function (_callback) {
            callback = _callback;
        }
    };
};

maybeOneOneSecondLater().then(callback);

这种设计有两个缺点:

var promise = maybeOneOneSecondLater()
promise.then(res => {
    console.log(1, res)
})
promise.then(res => {
    console.log(2, res)
})
setTimeout(() => {
    promise.then(res => {
        console.log(3, res)
    })
}, 2000)

更为通用的解决方案将接受任意数量的回调,并允许在超时之前或之后(通常是解决事件)之前或之后对其进行注册。我们通过使promise成为两个状态的对象来实现这一点。

最初未解决Promise,并且所有回调都添加到未决观察者数组中。兑现诺言后,将通知所有观察员。兑现承诺后,将立即调用新的回调。我们通过等待的回调数组是否仍然存在来区分状态变化,并在解决之后将它们丢弃。

var maybeOneOneSecondLater = function () {
    var pending = [], value;
    setTimeout(function () {
        value = 1;
        for (var i = 0, ii = pending.length; i < ii; i++) {
            var callback = pending[i];
            callback(value);
        }
        pending = undefined;
    }, 1000);
    return {
        then: function (callback) {
            if (pending) {
                pending.push(callback);
            } else {
                callback(value);
            }
        }
    };
};

这已经足够了,将其分解为实用程序功能将很有用。递延对象包括两个部分:一个部分用于 registering observers 注册观察者,另一部分用于 notifying observers 通知观察者解决方案。(请参阅design / q0.js)

var defer = function () {
    var pending = [], value;
    return {
        resolve: function (_value) {
            value = _value;
            for (var i = 0, ii = pending.length; i < ii; i++) {
                var callback = pending[i];
                callback(value);
            }
            pending = undefined;
        },
        then: function (callback) {
            if (pending) {
                pending.push(callback);
            } else {
                callback(value);
            }
        }
    }
};

var oneOneSecondLater = function () {
    var result = defer();
    setTimeout(function () {
        result.resolve(1);
    }, 1000);
    return result;
};

oneOneSecondLater().then(callback);

duck typing

Duck Typing 的原话是,走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么它就是一只鸭子.