Javascript承诺以相反的顺序加载

时间:2016-01-16 18:35:28

标签: javascript database image parsing upload

我正在尝试将图片以及从表单捕获的其他一些数据上传到我的Parse数据库。很多此代码都是从Parse Javascript指南中复制的。名称,价格和描述详细信息上传正常,但图片永远不会上传。我在日志上得到的是:

  

添加项目......

     

项目成功添加!

     

项目已成功上传!

按顺序......我不确定为什么会发生这种情况,特别是因为我正在使用整个承诺范式。为什么要在上传图片之前添加项目?为什么这段代码不起作用?

function addItem()
{
    console.log('adding item...');
    var Item = Parse.Object.extend("FoodItem");
    var newItem = new Item();
newItem.set("createdBy", Parse.User.current());
newItem.set("name",$('#itemName').val());
newItem.set("price",parseInt($('#itemPrice').val()));
newItem.set("description",$('#itemDescription').val());

//Upload pic to parse cloud 
var fileUploadControl = $("#itemImage")[0];
if (fileUploadControl.files.length > 0) 
{
    var file = fileUploadControl.files[0];
    var name = "photo.jpg";
    var parseImage = new Parse.File(name, file);
}

parseImage.save().then
(
    function() 
    {
        newItem.set(name,parseImage);
        console.log("Image sucessfully uploaded!");
        return;
    }
).then
(
    newItem.save().then
    ( 
        function()
        {
            console.log("Item sucessfully added!")
        },
        function(error) 
        {
        // there was some error.
            alert("Saving item failed with error code " + error.message);
        }
    )
);

return false;

}

1 个答案:

答案 0 :(得分:0)

.then()将函数作为参数。在您的第二个.then()中,您希望在解析promise时传递要调用的函数。相反,你实际上正在调用函数并将结果传递给那么..所以函数在第一个promise解析之前被调用。此外,您应该从第一个.then()返回承诺。我认为以下内容应该有效:

parseImage.save().then(function() {
    newItem.set(name,parseImage);
    console.log("Image sucessfully uploaded!");
    return newItem.save();
})
.then(function() {
        console.log("Item sucessfully added!")
      },
      function(error) {
         // there was some error.
        alert("Saving item failed with error code " + error.message);
      });