@krlljs

Как вернуть значение из Promise у Javascript?

'use strict';

const VKapi = require('node-vkapi');
var urlencode = require('urlencode');
var _ = require('underscore');
 
const VK = new VKapi({
  token: 'a89e24c414d82ba1a3fad33989f833339dsdb6db615004dfa01de61f73cac48eabdff34e4e8bf846e1a2f'
});

var start = function(user_id) {
  VK.call('groups.get', {
	  user_id: user_id,
	})
  .catch(e => {console.log(e)});
}

var b;
var a = start(343910101).then(res => {b = res});
console.log(b);

C:\Users\Общий\Desktop\vks>node gtp.js
undefined
  • Вопрос задан
  • 38324 просмотра
Решения вопроса 4
alexey-m-ukolov
@alexey-m-ukolov Куратор тега JavaScript
У вас всё правильно, кроме того, что вы выводите b синхронно до того, как оно заполнится.
Как только у вас хотя бы в одной функции появляются промисы и асинхронность - забудьте про синхронный код, только .then().

var b;
start(343910101)
.then(res => {b = res})
.then(() => console.log(b));
Ответ написан
maxfarseer
@maxfarseer
https://maxpfrontend.ru, обучаю реакту и компании
Отличная статья (хабр) на эту тему
Ответ написан
Комментировать
@bromzh
Drugs-driven development
Никак. Промисы не делают код синхронным. Это просто более удобный способ организовать цепочку вызовов асинхронных функций. Получить и использовать значение можно только внутри колбеков (которые внутри then/catch).
Ответ написан
@krlljs Автор вопроса
С помощью async/await конструкции, только нужно учитывать что код становится сихронным
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Zas999
Вот часть моего кода где мне нужно вернуть значение:
const findMany = ({value, columns = [], findByColumn}) => {
            return new Promise((resolve, reject) => {
                let query =new QueryBuilder().select(columns).from("users")
                    .where(findByColumn, "=", value)
                    .get();

                __db.query(query, (error, results, fields)=>{
                    if (error) reject(error);
                    __db.end();

                    if(results.length <= 0) resolve(null);

                    let users = [];
                    results.forEach((item, index, array)=>{
                        users.push(new User(item));
                    });
                    resolve(users)
                });
            });
        }


id : ({value, columns = []}) => {
                return findOne({
                    value,
                    columns,
                    findByColumn : "id"
                });
            },


И после получаю значение следующим образом:
let user = await User.findBy().id({value : 1});
console.log(user);
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект
21 нояб. 2024, в 22:21
3000 руб./в час