Другое решение состоит в том, чтобы выполнить код через последовательный исполнитель nsynjs .
nsynjs будет последовательно оценивать все обещания и ставить обещания результат в свойство data
:
function synchronousCode() {
var getURL = function(url) {
return window.fetch(url).data.text().data;
};
var url = 'https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js';
console.log('received bytes:',getURL(url).length);
};
nsynjs.run(synchronousCode,{},function(){
console.log('synchronousCode done');
});
Шаг 1. Wrap с обратным вызовом в оболочку, совместимую с nsynjs (если у нее есть обещанная версия, вы можете пропустить этот тест):
var ajaxGet = function (ctx,url) {
var res = {};
var ex;
$.ajax(url)
.done(function (data) {
res.data = data;
})
.fail(function(e) {
ex = e;
})
.always(function() {
ctx.resume(ex);
});
return res;
};
ajaxGet.nsynjsHasCallback = true;
Шаг 2. Вставить синхронную логику в функцию:
function process() {
console.log('got data:', ajaxGet(nsynjsCtx, "data/file1.json").data);
}
Шаг 3. Выполнить функцию синхронно через nnsynjs:
nsynjs.run(process,this,function () {
console.log("synchronous function finished");
});
Nsynjs будет оценивать все операторы и выражения шаг за шагом, приостанавливая выполнение в случае, если результат некоторой медленной функции не готов.
Дополнительные примеры здесь: https://github.com/amaksr/nsynjs/tree/master/examples
Я считаю, что вы используете эту операцию sql для Redshift. Можете ли вы изменить свой sql-скрипт, чтобы ссылаться на параметры, используя их позиционную нотацию. Чтобы ссылаться на параметры самого оператора sql, используйте $ 1, $ 2 и т. Д.
См. http://www.postgresql.org/docs/9.1/static/sql-prepare.html
Это скрипт, который отлично работает с psql shell:
insert into tempsdf select * from source where source.id = '123';
Вот некоторые из моих тестов в SqlActivity с использованием Data-Pipelines:
Тест 1 : Использование? '
insert into mytable select * from source where source.id = ?;
- отлично работает, если используется через параметр «script» и «scriptURI» объекта SqlActivity.
где "ScriptArgument" : "123"
здесь? может заменить значение условия, но не само условие.
Тест 2: Использование параметров работает, когда команда задана только с помощью опции «script»
где http://docs.aws.amazon.com/datapipeline/latest/DeveloperGuide/dp-custom-templates.html ( когда вы используете только параметры, убедитесь, что вы удалили неиспользуемые скриптыArguments - в противном случае он все равно будет бросать и ошибка) FAILED TESTS и inferences: insert в? выберите * из источника, где source.id =?; вставить? выберите * из источника, где source.id = '123'; Обе вышеприведенные команды не работают, потому что Названия таблиц не могут использоваться для заполнителей для аргументов сценария. '?' 's может использоваться только для передачи значений для условия сравнения и значений столбца. insert into # {myTable} select * from source где source.id = # {мой ID}; - не работает, если используется как «SciptURI» вставить в tempsdf select * из источника, где source.id = # {myId}; - не работает при использовании с 'ScriptURI' Выше 2 команды не работают, потому что Параметры не могут быть оценены, если скрипт хранится в S3. вставить в tempsdf select * из источника, где source.id = $ 1; - не работает с 'scriptURI' вставить в значения tempsdf ($ 1, $ 2, $ 3); - не работает. с использованием $ 's - не работает ни в одной комбинации Другие тесты: "ScriptArgument" : «123» «ScriptArgument»: «456» «ScriptArgument»: «789» scriptArguments будет следовать порядку, который вы вставляете и заменяет «?» в скрипте. insert into #{myTable} select * from source where source.id = ?;
- Работает нормально, если используется через ' скрипт ' insert into #{myTable} select * from source where source.id = #{myId};
#{myTable}
, #{myId}
- параметры, значение которых могут быть объявлены в шаблоне.
insert into tempsdf values (?,?,?);
- работает как scriptURI, скрипт и переводится на insert into tempsdf values ('123','456','789');
в работе shellcommand мы указываем два скриптовых атрибута для acces, используя $ 1 $ 2 в сценарии оболочки (.sh)
"scriptArgument": "'s3: // location_of_unload / # format (минусDays (@ scheduleStartTime, 1 ), 'YYYY / MM / dd / hhmm /')} '", # можно использовать с помощью $ 1" scriptArgument ":"' aws_access_key_id = ????; aws_secret_access_key = ******* '# может быть с помощью $ 2
Я не знаю, будет ли это работать для вас.