猿问

如何将现有的回调API转换为承诺?

我想使用promises,但我有一个回调API,格式如下:


1. DOM加载或其他一次性事件:

window.onload; // set to callback

...

window.onload = function() {


};

2.平原回调:

function request(onChangeHandler) {

    ...

}

request(function() {

    // change happened

    ...

});

3.节点样式回调(“nodeback”):

function getStuff(dat, callback) {

    ...

}

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

    ...

})

4.具有节点样式回调的整个库:

API;

API.one(function(err, data) {

    API.two(function(err, data2) {

        API.three(function(err, data3) {

            ...

        });

    });

});

如何在promises中使用API,我该如何“宣传”它?

如何将现有的回调API转换为承诺?

MMMHUHU
浏览 695回答 3
3回答

德玛西亚99

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 )     })}(我建议访问这个美丽的来源)也Promise可以一起使用async\await的ES7,以使程序流程等待一个fullfiled类似如下的结果:function getName () {    return new Promise(function (fulfilled, rejected) {        var name = "John Doe";        // wait 3000 milliseconds before calling fulfilled() method        setTimeout (             function() {                fulfilled( name )            },             3000        )    })}async function foo () {    var name = await getName(); // awaits for a fulfilled result!    console.log(name); // the console writes "John Doe" after 3000 milliseconds}foo() // calling the foo() method to run the code使用.then()方法使用相同代码的另一种用法function getName () {    return new Promise(function (fulfilled, rejected) {        var name = "John Doe";        // wait 3000 milliseconds before calling fulfilled() method        setTimeout (             function() {                fulfilled( name )            },             3000        )    })}// the console writes "John Doe" after 3000 millisecondsgetName().then(function(name){ console.log(name) })Promise也可以在任何基于Node.js的平台上使用react-native。奖励:混合方法(假设回调方法有两个参数作为错误和结果)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 )     })}上述方法可以响应旧时尚回调和Promise使用的结果。希望这可以帮助。在Node.JS中将函数转换为promise之前var request = require('request'); //http wrapped modulefunction requestWrapper(url, callback) {    request.get(url, function (err, response) {      if (err) {        callback(err);      }else{        callback(null, response);                   }          })}requestWrapper(url, function (err, response) {    console.log(err, response)})转换后var request = require('request');function requestWrapper(url) {  return new Promise(function (resolve, reject) { //returning promise    request.get(url, function (err, response) {      if (err) {        reject(err); //promise reject      }else{        resolve(response); //promise resolve      }    })  })}requestWrapper('http://localhost:8080/promise_request/1').then(function(response){    console.log(response) //resolve callback(success)}).catch(function(error){    console.log(error) //reject callback(failure)})如果你需要处理多个请求var allRequests = [];allRequests.push(requestWrapper('http://localhost:8080/promise_request/1')) allRequests.push(requestWrapper('http://localhost:8080/promise_request/2'))allRequests.push(requestWrapper('http://localhost:8080/promise_request/5'))    Promise.all(allRequests).then(function (results) {  console.log(results);//result will be array which contains each promise response}).catch(function (err) {  console.log(err)});

哆啦的时光机

今天,我可以用Promise在Node.js作为一个普通的JavaScript方法。一个简单而基本的例子Promise(用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 )     })}也Promise可以一起使用async\await的ES7,以使程序流程等待一个fullfiled类似如下的结果:function getName () {    return new Promise(function (fulfilled, rejected) {        var name = "John Doe";        // wait 3000 milliseconds before calling fulfilled() method        setTimeout (             function() {                fulfilled( name )            },             3000        )    })}async function foo () {    var name = await getName(); // awaits for a fulfilled result!    console.log(name); // the console writes "John Doe" after 3000 milliseconds}foo() // calling the foo() method to run the code使用.then()方法使用相同代码的另一种用法function getName () {    return new Promise(function (fulfilled, rejected) {        var name = "John Doe";        // wait 3000 milliseconds before calling fulfilled() method        setTimeout (             function() {                fulfilled( name )            },             3000        )    })}// the console writes "John Doe" after 3000 millisecondsgetName().then(function(name){ console.log(name) })Promise也可以在任何基于Node.js的平台上使用react-native。奖励:混合方法(假设回调方法有两个参数作为错误和结果)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 )     })}上述方法可以响应旧时尚回调和Promise使用的结果。希望这可以帮助。
随时随地看视频慕课网APP
我要回答