异步 - 如何在JavaScript中把有多个回调层级函数写成同步方式?
巴扎黑
巴扎黑 2017-04-10 16:54:22
[JavaScript讨论组]

现在代码如下

function getLocaltion(callback){
    window.navigator.geolocation.getCurrentPosition(pos =>{
        let url = '百度地图api查询详细信息接口'+pos
        fetch(url, {...options})
            .then(data =>callback(null,data))
            .catch(err =>callback(err))
       }
}

如何把它改成用promise或者async/await形式
直接 let address = getLocaltion()

巴扎黑
巴扎黑

全部回复(3)
黄舟

Async/Await
更新下,你可以自己把setTimeout改为你的异步方法:)

import fetch from "node-fetch"

function getLocaltion(callback) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            fetch("http://www.baidu.com", {
                    "Method": "GET"
                }).then(data => resolve(data))
                .catch(error => reject(error))
        }, 5000)
    })
}

(async() => {
    try {
        var result = await getLocaltion()
        console.log(result) // RESULT
    } catch (e) {
        // ERROR
    }
})();

测试环境:

  "devDependencies": {
    "babel-cli": "^6.0.0",
    "babel-plugin-transform-runtime": "^6.4.3",
    "babel-polyfill": "^6.3.14",
    "babel-preset-es2015": "^6.3.13",
    "babel-preset-stage-3": "^6.3.13",
    "babel-runtime": "^6.3.19"
  },
  "dependencies": {
    "node-fetch": "^1.3.3"
  }
黄舟

大概写一下是这样的。

var getCP = function () {
    return new Promise(function(resolve) {
     window.navigator.geolocation.getCurrentPosition(resolve);
    })
};

然后这样用:

getCP().then(function(position) {
    return fetch(…);
}).then(…);

手机打代码不方便,写了个大概。

重点就是把所有异步过程都封装成一个返回值为Promise的函数,像fetch那样。

高洛峰
const getLocaltion = callback => {
    let getCurrentPosition = new Promise(resolve => {
        window.navigator.geolocation.getCurrentPosition(resolve);
    });

    return getCurrentPosition.then(pos => {
        let url = '百度地图api查询详细信息接口' + pos;
        return fetch(url, {...options});
    }).then(data => callback(null, data)).catch(err => callback(err));
}
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号