2015-09-27 6 views
1

Я пытаюсь понять обещания, но Im ударил блокпост, я пытаюсь запросить базу данных Parse для последнего объекта текущей даты, чтобы плохо знать, когда он был запущен последним. Затем передайте эту дату следующей функции, которая может проверить мою базу данных фильмов на что-либо после последнего вызова. (Я делаю это, чтобы отправлять push-уведомления для новых полей, введенных вручную в класс Parse), а затем отправить push. Но я не понимаю. Затем и обещания, я новичок в JavaScript, поэтому любая помощь будет оценена!JavaScript Promises

Вот мой код, который у меня есть сейчас.

Parse.Cloud.job("TestSendNewMoviePush", function(request, response) { 
    var query = new Parse.Query("MovieStatus"); 
    var lastRunDateQuery = new Parse.Query("LastRun"); 
    var lastRunDate; 
    var newDate; 
    var newCount = 0; 
    var installQuery = new Parse.Query(Parse.Installation); 
    query.greaterThan("updatedAt", lastRunDate); 
    query.equalTo("CurrentStatus", "Ready"); 
    query.equalTo("imageStatusName", "Green"); 
    installQuery.equalTo("role", "downloader"); 

    lastRunDateQuery.get("d3WeNEwzIu", { 
    success: function(lastDateRanObj) { 
    console.log("Got the object " + lastDateRanObj); 
    var date = new lastDateRanObj.updatedAt; 
    lastRunDate = lastDateRanObj.updatedAt; 
    console.log(lastRunDate); 
    return lastRunDate; 
    }, 
    error: function(lastDateRanObj, error) { 
    console.log("Failed to get object"); 
    } 
}).then(
    query.count({ 
    success: function(count) { 
     newCount = count; 
     return newCount 

    }, 
    error: function(e) { 
    } 
    })).then(

    Parse.Push.send({ 
     where: installQuery, 
     data: { 
    "alert": newCount + " new movie(s) available!", 
    "badge": "Increment" 
} 
    }, { 
    success: function() { 
     response.success("Success"); 
    }, 
    error: function(e) { 
     response.error("Error:" + e.code); 
    } 
    })); 
}); 
+0

затем принимает функцию обратного вызова в качестве параметра. Вы не передаете функцию своим последующим вызовам. – bhspencer

+0

Возможно, вы захотите ознакомиться с цепочкой обещаний. Http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-asynchronous-call/14220323#14220323 .. node.js но хорошо https://github.com/kriskowal/q и –

+0

Начните с использования методов объекта 'success' и' error'. Тогда не забывайте «возвращать» свои обещания повсюду. И, как сказал bhspencer, вам нужно передать функции обратного вызова на 'then'. Он получит «newcount» в качестве аргумента. – Bergi

ответ

1

lastRunDateQuery.get() возвращает объект Promise, который вы можете цепи с then, которая сама по себе функция принимает 2 функции в качестве аргументов: один, который вызывается, если обещание не будет решена, и тот, который вызывается, если обещание, отклоняется. Вы можете использовать эти вместо параметров успеха и ошибок:

lastRunDateQuery.get() 
    .then(function(data) { 
     // success!! 
    }, function(error) { 
     // error :(
    }); 

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

lastRunDateQuery.get() 
    .then(function(data) { 
     // data is the result of lastRunDateQuery.get() 
     return query.count(); 
    }) 
    .then(function(data) { 
     // data is the result of query.count() 
     return someOtherThing.someOtherMethodReturningAPromise(); 
    }); 
    .then(function(data) { 
     // data is the result of someOtherThing.someOtherMethodReturningAPromise() 
    }); 

И так далее.

Я бы порекомендовал взглянуть на предложение Promises/A + - это очень поучительно.

EDIT:

Если концепция цепочки немного запутанным просто думать о нем, как сокращение для следующего:

var aPromise = lastRunDateQuery.get(); 
aPromise.then(
    function() {}, // promise was resolved -> call this function 
    function() {}, // promise was rejected -> call this function 
); 
+0

Ах! Хорошо! Позвольте мне попробовать это, но я думаю, что понимаю сейчас! – trever