国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

將標(biāo)題重寫為:如何將現(xiàn)有的回呼 API 轉(zhuǎn)換為 Promise 形式?
P粉268654873
P粉268654873 2023-08-21 18:34:55
0
2
517
<p>我想用promises來處理,但我的回呼API的格式如下:</p> <h3>1. DOM載入或其他一次性事件:</h3> <pre class="brush:php;toolbar:false;">window.onload; // 設(shè)定為回呼函數(shù) … window.onload = function() { };</pre> <h3>2. 普通回呼函數(shù):</h3> <pre class="brush:php;toolbar:false;">function request(onChangeHandler) { … } request(function() { // 發(fā)生了變化 … });</pre> <h3>3. Node風(fēng)格的回呼函數(shù)("nodeback"):</h3> <pre class="brush:php;toolbar:false;">function getStuff(dat, callback) { … } getStuff("dataParam", function(err, data) { … })</pre> <h3>4. 整個函式庫都是使用Node風(fēng)格的回呼函數(shù):</h3> <pre class="brush:php;toolbar:false;">API; API.one(function(err, data) { API.two(function(err, data2) { API.three(function(err, data3) { … }); }); });</pre> <h3>我如何使用promises來處理這個API,如何"promisify"它? </h3>
P粉268654873
P粉268654873

全部回覆(2)
P粉618358260

今天,我可以在Node.js中使用Promise作為一個普通的Javascript方法。

一個簡單且基本的Promise範(fàn)例(使用KISS方法):

普通的Javascript非同步API程式碼:

function divisionAPI (number, divider, successCallback, errorCallback) {

    if (divider == 0) {
        return errorCallback( new Error("Division by zero") )
    }

    successCallback( number / divider )

}

Promise的Javascript非同步API程式碼:

function divisionAPI (number, divider) {

    return new Promise(function (fulfilled, rejected) {

        if (divider == 0) {
            return rejected( new Error("Division by zero") )
        }

        fulfilled( number / divider )

     })

}

(我推薦訪問這個優(yōu)秀的來源

此外,Promise也可以與ES7中的async\await一起使用,使程式流程等待fulfilled結(jié)果,如下所示:

function getName () {

    return new Promise(function (fulfilled, rejected) {

        var name = "John Doe";

        // 在調(diào)用fulfilled()方法之前等待3000毫秒
        setTimeout ( 
            function() {
                fulfilled( name )
            }, 
            3000
        )

    })

}


async function foo () {

    var name = await getName(); // 等待fulfilled結(jié)果!

    console.log(name); // 控制臺在3000毫秒后輸出"John Doe"

}


foo() // 調(diào)用foo()方法運(yùn)行代碼

使用相同的程式碼,可以使用.then()方法:

function getName () {

    return new Promise(function (fulfilled, rejected) {

        var name = "John Doe";

        // 在調(diào)用fulfilled()方法之前等待3000毫秒
        setTimeout ( 
            function() {
                fulfilled( name )
            }, 
            3000
        )

    })

}


// 控制臺在3000毫秒后輸出"John Doe"
getName().then(function(name){ console.log(name) })

Promise也可以在任何基於Node.js的平臺上使用,例如react-native。

額外獎勵:一種混合方法
# (假設(shè)回呼方法有兩個參數(shù),分別是錯誤和結(jié)果)

function divisionAPI (number, divider, callback) {

    return new Promise(function (fulfilled, rejected) {

        if (divider == 0) {
            let error = new Error("Division by zero")
            callback && callback( error )
            return rejected( error )
        }

        let result = number / divider
        callback && callback( null, result )
        fulfilled( result )

     })

}

上述方法可以同時回應(yīng)舊式的回呼和Promise用法的結(jié)果。

希望這能幫到你。

P粉680087550

承諾具有狀態(tài),它們開始時處於掛起狀態(tài),可以解決為:

  • 已實(shí)現(xiàn)表示計(jì)算成功完成。
  • 已拒絕表示計(jì)算失敗。

傳回承諾的函數(shù)不應(yīng)該拋出例外,而應(yīng)該回傳拒絕。從傳回承諾的函數(shù)中拋出例外狀況將強(qiáng)制您同時使用} catch { .catch。使用承諾化的API的人們不希望承諾拋出異常。如果您不確定JS中的非同步API如何運(yùn)作,請先查看此答案

1. DOM載入或其他一次性事件:

因此,創(chuàng)建承諾通常意味著指定它們何時解決-這意味著它們何時移動到已實(shí)現(xiàn)或已拒絕階段以指示資料可用(並可使用.then存?。?

使用支援Promise建構(gòu)子的現(xiàn)代承諾實(shí)作(如原生ES6承諾):

function load() {
    return new Promise(function(resolve, reject) {
        window.onload = resolve;
    });
}

然後您可以這樣使用生成的承諾:

load().then(function() {
    // 在onload之后執(zhí)行操作
});

使用支援延遲(這裡我們使用$q作為範(fàn)例,但稍後我們也會使用jQuery)的函式庫:

function load() {
    var d = $q.defer();
    window.onload = function() { d.resolve(); };
    return d.promise;
}

或使用類似jQuery的API,鉤住一次發(fā)生的事件:

function done() {
    var d = $.Deferred();
    $("#myObject").once("click",function() {
        d.resolve();
    });
    return d.promise();
}

2. 普通回呼:

這些API相當(dāng)常見,因?yàn)樵贘S中回呼很常見。讓我們來看看常見情況下的onSuccessonFail

function getUserData(userId, onLoad, onFail) { …

使用支援Promise建構(gòu)子的現(xiàn)代承諾實(shí)作(如原生ES6承諾):

function getUserDataAsync(userId) {
    return new Promise(function(resolve, reject) {
        getUserData(userId, resolve, reject);
    });
}

使用支援延遲(這裡我們使用jQuery作為範(fàn)例,但我們之前也使用了$q)的函式庫:

function getUserDataAsync(userId) {
    var d = $.Deferred();
    getUserData(userId, function(res){ d.resolve(res); }, function(err){ d.reject(err); });
    return d.promise();
}

jQuery也提供了$.Deferred(fn)形式,它的優(yōu)點(diǎn)是允許我們寫一個非常接近new Promise(fn)形式的表達(dá)式,如下所示:

function getUserDataAsync(userId) {
    return $.Deferred(function(dfrd) {
        getUserData(userId, dfrd.resolve, dfrd.reject);
    }).promise();
}

注意:這裡我們利用了jQuery延遲的resolvereject方法是「可分離」的事實(shí);即它們綁定到j(luò)Query.Deferred()的實(shí)例。並非所有庫都提供此功能。

3. Node風(fēng)格回呼("nodeback"):

Node風(fēng)格回呼(nodebacks)具有特定的格式,其中回呼始終是最後一個參數(shù),其第一個參數(shù)是錯誤。首先手動將其轉(zhuǎn)換為承諾:

getStuff("dataParam", function(err, data) { …

轉(zhuǎn)換為:

function getStuffAsync(param) {
    return new Promise(function(resolve, reject) {
        getStuff(param, function(err, data) {
            if (err !== null) reject(err);
            else resolve(data);
        });
    });
}

使用延遲,您可以執(zhí)行以下操作(我們使用Q作為範(fàn)例,儘管Q現(xiàn)在支援新語法您應(yīng)該優(yōu)先選擇該語法):

function getStuffAsync(param) {
    var d = Q.defer();
    getStuff(param, function(err, data) {
        if (err !== null) d.reject(err);
        else d.resolve(data);
    });
    return d.promise;   
}

一般來說,您不應(yīng)該手動過多地將事物轉(zhuǎn)換為承諾,大多數(shù)針對Node設(shè)計(jì)的承諾庫以及Node 8 中的原生承諾都具有用於將nodebacks轉(zhuǎn)換為承諾的內(nèi)建方法。例如

var getStuffAsync = Promise.promisify(getStuff); // Bluebird
var getStuffAsync = Q.denodeify(getStuff); // Q
var getStuffAsync = util.promisify(getStuff); // 原生承諾,僅限Node

4. 整個函式庫使用Node風(fēng)格回呼:

這裡沒有黃金法則,您可以逐一將它們轉(zhuǎn)換為承諾。但是,某些承諾實(shí)作允許您批量執(zhí)行此操作,例如在Bluebird中,將nodeback API轉(zhuǎn)換為承諾API就像這樣簡單:

Promise.promisifyAll(API);

或在Node中使用原生承諾

const { promisify } = require('util');
const promiseAPI = Object.entries(API).map(([key, v]) => ({key, fn: promisify(v)}))
                         .reduce((o, p) => Object.assign(o, {[p.key]: p.fn}), {});

注意:

  • 當(dāng)您在.then處理程序中時,當(dāng)然不需要將事物轉(zhuǎn)換為承諾。從.then處理程序傳回一個承諾將使用該承諾的值解決或拒絕。從.then處理程序中拋出異常也是良好的實(shí)踐,將拒絕該承諾-這就是著名的承諾拋出安全性。
  • 在實(shí)際的onload情況中,您應(yīng)該使用addEventListener而不是onX。
最新下載
更多>
網(wǎng)站特效
網(wǎng)站源碼
網(wǎng)站素材
前端模板