Подтвердить что ты не робот

Как подождать завершения обещания, прежде чем возвращать переменную функции?

Я все еще борется с promises, но сделаю некоторый прогресс благодаря сообществу здесь.

У меня есть простая функция JS, которая запрашивает базу данных Parse. Он должен возвращать массив результатов, но, очевидно, из-за асинхронного характера запроса (следовательно, promises) функция возвращается до результатов, оставляя меня с массивом undefined.

Что мне нужно сделать, чтобы заставить эту функцию ждать результата обещания?

Здесь мой код:

function resultsByName(name)
{   
    var Card = Parse.Object.extend("Card");
    var query = new Parse.Query(Card);
    query.equalTo("name", name.toString());

    var resultsArray = [];

    var promise = query.find({
               success: function(results) {
               // results is an array of Parse.Object.
                             console.log(results);
                             //resultsArray = results;
                             return results;
               },

               error: function(error) {
               // error is an instance of Parse.Error.
                             console.log("Error");
               }
    });                           

}
4b9b3361

Ответ 1

Вместо возврата resultsArray вы возвращаете обещание для массива результатов, а затем then, что на сайте вызова - это имеет дополнительное преимущество вызывающего устройства, зная, что функция выполняет асинхронный ввод-вывод. Кодирование concurrency в JavaScript основано на этом - вы можете прочитать этот вопрос, чтобы получить более широкую идею:

function resultsByName(name)
{   
    var Card = Parse.Object.extend("Card");
    var query = new Parse.Query(Card);
    query.equalTo("name", name.toString());

    var resultsArray = [];

    return query.find({});                           

}

// later
resultsByName("Some Name").then(function(results){
    // access results here by chaining to the returned promise
});

Вы можете увидеть больше примеров использования parse promises с запросами в Прокомментировать собственное сообщение в блоге.

Ответ 2

Вы не можете заставить функцию ждать.
Скорее верните обещание в конце функции, тогда вызывающая функция может использовать обещание получить ответ сервера.

var promise = query.find(); 
return promise; 

//Or return query.find(); 

Ответ 3

Здесь вы не используете promises. Parse позволяет использовать обратные вызовы или promises; ваш выбор.

Чтобы использовать promises, выполните следующие действия:

query.find().then(function() {
    console.log("success!");
}, function() {
    console.log("error");
});

Теперь, чтобы выполнить материал после завершения обещания, вы можете просто выполнить его в обратном вызове обещания внутри вызова then(). Пока это будет точно так же, как обычные обратные вызовы.

Чтобы эффективно использовать promises, когда вы их связываете так:

query.find().then(function() {
    console.log("success!");

    return new Parse.Query(Obj).get("sOmE_oBjEcT");
}, function() {
    console.log("error");
}).then(function() {
    console.log("success on second callback!");
}, function() {
    console.log("error on second callback");
});

Ответ 4

Что мне нужно сделать, чтобы заставить эту функцию ждать результата обещания?

Используйте async/await (НЕ входит в ECMA6, но   доступный для Chrome, Edge, Firefox и Safari с конца 2017 года, см. canIuse)   
MDN

    async function waitForPromise() {
        let result = await Promise.resolve('this is a sample promise');
    }

В качестве побочного элемента: С# имеет это уже несколько лет (!).