2017-02-02 5 views
1

Я пытаюсь создать функцию JavaScript/машинописного текста, которая заверяет обещание, возвращая новое обещание, добавляя попытку catch и обратный вызов для пользователя, чтобы написать код. Это понятие:Обложка TypeScript и Promise с Async/Await. Как привязать устаревший код?

function XPromise(code) { 
    return new Promise((resolve, reject) => { 
     try { 
      resolve(code()); 
     } catch (exception) { 
      reject(exception); 
     } 
    }); 
} 

Но как бы я использовать фрагмент кода выше в чем-то вроде этого:

async function GetData(testClient, project, testPlan, suiteId) { 
    return XPromise(code => { 
     console.debug("GetData"); 
     testClient.getData(project, testPlan, suiteId) 
      .then(data => { 
       if (data.length === 0) reject(data); 
       resolve(data); 
      }); 
} 

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

Если я это сделать:

function XPromise(code, resolve, reject) { 
    return new Promise((resolve, reject) => { 
     try { 
      resolve(code()); 
     } catch (exception) { 
      reject(exception); 
     } 
    }); 
} 

async function GetData(testClient, project, testPlan, suiteId) { 
    return XPromise(code => { 
     console.debug("GetData"); 
     testClient.getData(project, testPlan, suiteId) 
      .then(data => { 
       if (data.length === 0) reject(data); 
       resolve(data); 
      }); 
    }, 
    resolve => { }, 
    reject => { } 
} 

Я не знаю, как получить то логику, чтобы сделать это дело в «низших» функций.

Причина, по которой я хочу новую обертку Promise, заключается в том, что у меня есть тонна этих вещей для реализации ... Я не хочу делать это во всем коде. Этот код компилируется, но мне требуется написать команды «Новые обещания» и «Попробовать вылов» для каждой реализуемой мной функции.

async function GetData(testClient, project, testPlan, suiteId) { 
    return new Promise((resolve, reject) => { 
     console.debug("GetPoints"); 
     try { 
      testClient.getData(project, testPlan, suiteId) 
       .then(data => { 
        if (data.length === 0) reject(data); 
        resolve(data); 
       }); 
     } catch (exception) { reject(exception); } 
    }); 
} 

ответ

2

Вы не должны передавать значения параметров, отклонять новые Promise(). Они передаются с помощью локального объекта обещания при вызове вашего обратного вызова. вам просто нужно вызвать его, чтобы обещать это решение или отклонить.

new Promise((resolve,reject)=>{ 
    if(condition){ 
    resolve();// resolve is callback sent by promise object. you just invoke it 
    }else{ 
    reject(); like resolve reject makes this promise to fail 
    } 
}); 

я думаю, что ваш последний вышеупомянутый логик верен

async function GetData(testClient, project, testPlan, suiteId) { 
    return new Promise((resolve, reject) => { 
     console.debug("GetPoints"); 
     try { 
      testClient.getData(project, testPlan, suiteId) 
       .then(data => { 
        if (data.length === 0) reject(data); 
        resolve(data); 
       }); 
     } catch (exception) { reject(exception); } 
    }); 
} 

Примечания: асинхронный/Await не является замена для обещания. если вы хотите создать обещание, вы должны его создать. вы можете использовать async/wait, чтобы избежать цепочки, и ваш код выглядит синхронным и понятным. но они остаются асинхронными.

, но в вашем случае вы можете использовать Promise.resolve(), Promise.reject(), чтобы избежать нового Promise() см.,

async function GetData(testClient, project, testPlan, suiteId) {  
     console.debug("GetPoints"); 
     try { 
      const data = await testClient.getData(project, testPlan, suiteId);     
      if (data.length === 0) return Promise.reject(data); 
      return Promise.resolve(data); 

     } catch (exception) { return Promise.reject(exception); }  
}