Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用承诺异步调用此函数_Javascript_Asynchronous_Parse Platform_Promise_Q - Fatal编程技术网

Javascript 如何使用承诺异步调用此函数

Javascript 如何使用承诺异步调用此函数,javascript,asynchronous,parse-platform,promise,q,Javascript,Asynchronous,Parse Platform,Promise,Q,我正在尝试创建一个parse.com函数,该函数检查数据库中的记录,并创建一个新的记录,或者返回现有的记录(如果存在)。我想异步地做这件事,我正在尝试使用承诺(我想是q)。语法让我有点困惑,这是我尝试过的,但它带来了错误“无法调用未定义的方法'then'”,我如何将其作为一个正确的承诺来写呢 function createPersonIfDoesNotExist(personName) { var Person = Parse.Object.extend("Person");

我正在尝试创建一个parse.com函数,该函数检查数据库中的记录,并创建一个新的记录,或者返回现有的记录(如果存在)。我想异步地做这件事,我正在尝试使用承诺(我想是q)。语法让我有点困惑,这是我尝试过的,但它带来了错误“无法调用未定义的方法'then'”,我如何将其作为一个正确的承诺来写呢

  function createPersonIfDoesNotExist(personName)
  {
    var Person = Parse.Object.extend("Person");
    var personQuery = new Parse.Query(Person);
    personQuery.equalTo("Name", personName);
    personQuery.find({
      success: function(results) {
        console.log("Successfully retrieved " + results.length + " person.");
        if(results.length >0){
          console.log("Looks like this person exists already, no point it making a new one");
          var artist =  results[0];
          return artist;
        }
        else
        {
          // Create a new Person
          var person = new Person();
          return person;
        }
      },
      error: function(error) {
        console.log("Error: " + error.code + " " + error.message);
        return error;
      }
    });
  }

  var promise = createPersonIfDoesNotExist(personname);
  promise.then(console.log, console.error);

操作代码不返回任何内容。它应该返回由parse find()或save()方法生成的承诺

如果您编写的小函数能够在解析承诺返回函数的基础上创建小的、增值的承诺,那么阅读和维护就会变得更容易

// return a promise that is fulfilled with a new Person with the given name
function createPersonNamed(personName) {
    var Person = Parse.Object.extend("Person");
    var person = new Person();
    person.set("Name", personName);
    return person.save();
}

// return a promise that is fulfilled with the first existing person with a given name
function findPersonNamed(personName) {
    var Person = Parse.Object.extend("Person");
    var personQuery = new Parse.Query(Person);
    personQuery.equalTo("Name", personName);
    return personQuery.first();
}

// return a promise that is fulfilled with either an existing person with a given name,
// or a newly created one if the Person does not exist
function findOrCreatePersonNamed(personName) {
    return findPersonNamed(personName).then(function(person) {
        return (person)? person : createPersonNamed(personName);
    });
}

似乎有两个问题-您的函数被调用为
createPersonifDeesnotexist
,但您正在调用
createArtistIfDoesNotExist
。此外,函数不会返回任何内容。如果
personQuery.find()
是创建承诺的函数,则需要返回该函数。没有理由使用Q,Parse已经附带了自己的承诺实现。不要使用
success
error
参数。