2016-05-23 2 views
2

здесь кусок кода, который должен работать безупречно, как мне известно, но сбой сервераброска в обещании падает сервер

примечание: Я использую ES6 с Вавилонской

const getDataFromCouchBase = function (siteId) { 
    return new Promise((resolve, reject) => { 
     const cluster = new couchbase.Cluster('127.0.0.1:8091'), 
      bucket = cluster.openBucket(bucketName, (err) => { 
       console.log("err: ", err); 
       if (err) { 
        throw err; 
        //reject(err); 
       } 

       // Retrieve a document 
       bucket.get(`site::${siteId}`, (err, result) => { 
        console.log("err: ", err); 
        console.log("result: ", result); 
        if (err) { 
         throw err; 
         //reject(err); 
        } 
        resolve(result.value); 
       }); 
      }); 
    }); 
} 

и вот я звоню эту функцию с then и catch

getDataFromCouchBase(siteId).then((site) => { 
    console.log(site); 
}).catch((err) => { 
    console.log(err); 
}); 

в случае неправильного bucketN AME или документ не доступен в ведре он выходит из строя сервер вместо брошенной ошибки быть обработаны catch блоком

ответ

3

Единственный раз, когда обещает «ручка» кидает для вас в синхронном коде внутри new Promise обратного вызова или в синхронном коде в a then или catch обратный вызов. Я не знаю CouchBase, но я предполагаю, что обратный вызов openBucket является асинхронным, поэтому он полностью выходит за рамки обработки обещаний.

Вы хотите, чтобы ваш код с кодом: reject(err);, а не throw err;. Это в большей степени соответствует тому, что вы делаете.

Вот аналог кода с помощью setTimeout имитировать асинхронность:

const getDataFromCouchBase = function() { 
    return new Promise((resolve, reject) => { 
     setTimeout(() => { 
      throw new Error("asynchronous throw"); 
     }, 0); 
    }); 
} 
getDataFromCouchBase() 
    .then(r => { 
     console.log("result:", r); 
    }) 
    .catch(e => { 
     console.log("error:", e.message); 
    }); 

Live on Babel's REPL

Обратите внимание, как throw не является (и не может быть) преобразуется к отрицанию для вас. (. Это проявляется в реальной веб-консоли [не Бабель псевдо-консоль, фактически один в Devtools])

Это может быть (и есть) преобразуются к отклонению, если throw является синхронного:

const getDataFromCouchBase = function() { 
    return new Promise((resolve, reject) => { 
     throw new Error("synchronous throw"); 
    }); 
} 
getDataFromCouchBase() 
    .then(r => { 
     console.log("result:", r); 
    }) 
    .catch(e => { 
     console.log("error:", e.message); 
    }); 

Live copy on Babel's REPL

Обратите внимание, как throw превращается в отказ для вас. Но в вашем случае я уверен, что обратный вызов называется асинхронно.

+1

благодарит за быстрый ответ, что прояснил несколько вещей :) – panghal0

+0

Да, обратный вызов был асинхронным. но у меня сложилось впечатление, что обещание также будет обрабатывать ошибку. мой плохой – panghal0

+0

@ panghal0: Легко сделано. –