javascript - 异步函数未返回完成的 promise

标签 javascript ecmascript-6

我有一个 javascript 文件,可以在其中获取用户的地理位置。我将它包装在一个 promise 中,以确保它返回坐标。

geoLocation.js:

const getGeoLocation = () => {
  return new Promise(function(resolve, reject){
    function positionSuccess(position){             
      resolve(position);
    }
    function positionError(error){
      reject('ERROR: ' + error.code + ': ' + error.message);
    };
    navigator.geolocation.getCurrentPosition(positionSuccess, positionError);
  });
};

async function userCoords() {
  const response = await getGeoLocation();
}

module.exports = userCoords;

从这里我将异步 userCoords 函数导入到 Main.js react 组件中。在它的渲染方法中,我要求它console.log(userCoords()),但我在控制台中得到的是:

enter image description here

看起来它仍在等待完成我的 getGeoLocation promise 。我应该做什么来确保 getGeoLocation 完全完成并且我可以将其返回坐标传递给我的 Main.js 组件?

谢谢!

最佳答案

异步函数将始终返回一个 promise ,即使它已经解决了。您必须使用 promise.thenawait。如果您可以使渲染函数异步,那么您可以编写:

console.log(await userCoords());

异步函数是有毒的,这意味着任何调用异步函数(并期望确定值)的函数本身都必须是异步的。在编写用户界面时,这是特别痛苦的,因为 UI 代码本质上是同步的。显示来自异步数据源的数据很难做好,需要仔细的设计。

也许您能做的最简单的事情就是独立于渲染周期轮询用户坐标:

var coords_promise = null;
var coords = null;

function render() {
    if (!coords_promise) {
        coords_promise = userCoords().then(function(newCoords) {
            coords = newCoords;
            coords_promise = null;
        });
    }
    console.log(coords);
}

setInterval(render, 20);

这段代码将在调用渲染函数时开始获取坐标。这意味着渲染函数的前几个周期将打印 coords 变量的初始值,但之后它将使用 userCoords() 的最新确定的返回值。此代码还确保,如果未调用 render() 函数,则不会进行任何提取,并且不会对 userCoords() 进行并行调用。

关于javascript - 异步函数未返回完成的 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32404776/

相关文章:

javascript - 列表 : {[id]:array1} and list: {. ..state.list、[id] :array1} in ReactJs? 之间有什么区别

javascript - react-select 使用标签作为传递给组件的值,而不是选项数组中的值

javascript - ECMAScript 2017 : EscapeSequence in StringLiteral

javascript - 如何从对象内部调用类函数?

javascript - 使用 JavaScript 自定义动画

javascript - 在 Node 中抓取 .aspx 页面

javascript - 在vuejs中创建/w v-for时如何默认选择单选按钮?

javascript - 在 JavaScript ES6 中,for-in 循环和 for-of 循​​环中,变量 i 在 block 的每次迭代后不再存在?

javascript - Chrome 扩展 : Why is my response returning before the AJAX call?

javascript - 如何在不破坏功能的情况下跨浏览器隐藏滚动条