Возвращаемое значение из Promise, затем функция обратного вызова - PullRequest
0 голосов
/ 12 сентября 2018

в следующем коде:

function getPosition() {
    return new Promise((res, rej) => {
        navigator.geolocation.getCurrentPosition(res, rej);
    });
}

function main() {
    getPosition().then(console.log);
}

main();

Я могу зарегистрировать объект Position в браузере. Но что, если вместо регистрации я хочу вернуть это значение, чтобы оно могло использоваться вне then () . Это возможно?

Я попробовал следующее:

function main() {
    return getPosition().then();
}

console.log(main());

Но вместо просмотра моего объекта Position в журнале я вижу следующее:

Promise {<pending>}
__proto__: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: Position

Спасибо заранее.

Обновление Это тоже не работает

function main() {
    getPosition().then(function(response){
        return response;
    });
}

console.log(main());

Я получил undefined в журнале.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Promise предназначен для обработки async операций (подумайте о вызовах ajax или коде, выполняемом внутри setTimeout), поэтому вы не можете получить что-то подобное

console.log(getPosition().then())

вам нужно передать обратный вызов методу then, этот обратный вызов будет выполнен, когда обещанное будет разрешено (подумайте об успешном обратном вызове в jquery)

Так что в основном в вашем примере вы бы получили что-то вроде этого:

function main() {
  return getPosition();
}

main().then(console.log);

вы также можете сохранить обещание в переменной, чтобы использовать его где-то еще в вашем коде

var position = main();

position.then(console.log);
position.then(console.log);
position.then(positionValue => {/* do what you want with the value */});

Обратите внимание, что вызов then несколько раз не будет выполнять обещание несколько раз, оно будет разрешено только один раз

Вот документация обещания

0 голосов
/ 12 сентября 2018

Вы можете использовать async / await

async function main() {
    console.log(await getPosition());
}

Вот рабочий фрагмент, демонстрирующий это:

function getPosition() {
    return new Promise((res, rej) => {
        // simulate API
        setTimeout( ()=> res('123,456'), 1000)
    });
}

async function main(){
  console.log(await getPosition())
}

main()
...