为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

MMMHUHU 2019-05-21 15:30:14
我想使用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转换为承诺?
查看完整描述

3 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

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 milliseconds

getName().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 module


function 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)

});


查看完整回答
反对 回复 2019-05-21
?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

今天,我可以用PromiseNode.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 milliseconds

getName().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使用的结果。


希望这可以帮助。


查看完整回答
反对 回复 2019-05-21
  • 3 回答
  • 0 关注
  • 694 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信