0

Я пытаюсь вставить некоторые данные в хранилище таблиц из инструкции вставки SQL Azure EasyTables, но вызывает вызов context.execute() до того, как таблица будет создана в таблице хранилище, которое останавливает мое соединение, даже если код для создания новой таблицы помещается перед context.execute(). Может кто-нибудь сказать мне, как я мог бы остановить функцию context.execute, пока не закончу настройку хранилища. Ниже мой код. Спасибо за помощьAzure Node: доступ к хранилищу таблиц из функции SQL Azure Easy tables insert

table.insert(function (context) { 
    var azure = require('azure-storage'); 
    var tableService = azure.createTableService('NAME', 'KEY'); 

    context.user.getIdentity().then((data) => { 
     tableService.createTableIfNotExists('UserInfo', function(error, result) { 
      if (error) { 
       //do something 
      }else { 

       var entGen = azure.TableUtilities.entityGenerator; 
       var task = { 
        PartitionKey: entGen.String(context.user.id), 
        RowKey: entGen.String('1'), 
        name : entGen.String(data.facebook.claims.name), 
        email : entGen.String(data.facebook.claims.emailaddress), 
        createdOn: entGen.DateTime(new Date(Date.UTC(2016, 3, 27))), 
       }; 

       tableService.insertEntity('UserInfo',task, function (error, result, resp) { 
        if(!error){ 
         //respond with success message 
        }else{ 
         //respond with failure message 
        } 
       }); 
      } 
     }); 
    }); 

     context.item.userId = context.user.id; 
     return context.execute(); //This line is executed before I get success/failure response from table storage 

}); 

ответ

0

Я написал таблицуService.createTableIfNotExists (...); в новую функцию, а затем вызвал функцию из «использования»

table.insert.use (insertMiddleware, table.operation);

0

Это потому, что getIdentity() возвращает объект Promise.

Код then((data) => { ... }) будет выполнен после успешного его вызова.

Более подробно о том, как работает Promise.then(), пожалуйста см here

Вы можете написать код tableService.createTableIfNotExists(...); в метод и вызвать метод в context.execute().

+0

Но Алекс не должен затем ((data) => {...}) выполнить перед методом context.execute(), и я все равно должен был бы создать таблицу? или вы говорите, что context.execute происходит сначала, затем приходит then ((data) => {...}) –

+0

Я имею в виду, что когда ваш код запускается в 'context.user.getIdentity(), программа проверяет, getIdentity() 'выдает ошибку, если нет, то «then ((data) => {...})» будет выполняться сразу, вставляя новую Entity в таблицу. Я думаю, что «context.execute()» здесь бесполезен. Вы можете сделать так: 1) переместить код tableService.createTableIfNotExists (...); в метод и вызовите метод в context.execute(). или 2) удалить 'context.execute()'. –

+0

Спасибо Alex, но если я удалю context.execute(), который я пробовал ранее, я получаю. В элементе отсутствует ошибка. Метод «insert» ожидает оператора return. и любое заявление о возвращении, которое я помещаю в место контекста. execute(), этот оператор выполняет снова перед созданием таблицы, поэтому я возвращаюсь к квадрату 1. Я исправил свою проблему, см. мой ответ ниже. Промежуточное «использование» всегда выполняется перед операцией таблицы, пока я не укажу, чтобы перейти к операции с таблицей. поэтому я переместил весь свой код там –